package com.catazy.album.data.datasource.api.model

import com.catazy.album.data.datasource.database.model.ImageSizeEntityModel
import com.catazy.album.domain.enum.ImageSize
import kotlinx.serialization.SerialName
import kotlinx.serialization.Serializable

/**
 * 作者: Tao
 * 日期: 2024/12/23
 * 时间: 10:04
 * 描述: 枚举类：ImageSizeApiModel
 * 用于表示图像的不同尺寸
 * 在序列化和反序列化过程中，使用@Serializable和@SerialName注解来控制JSON与枚举常量之间的映射
 */
@Serializable
internal enum class ImageSizeApiModel {

    // 中号图像尺寸
    @SerialName("medium")
    MEDIUM,

    // 小号图像尺寸
    @SerialName("small")
    SMALL,

    // 大号图像尺寸
    @SerialName("large")
    LARGE,

    // 超大号图像尺寸
    @SerialName("extralarge")
    EXTRA_LARGE,

    // 巨型图像尺寸
    @SerialName("mega")
    MEGA,

    // 未知图像尺寸，用于处理未定义的尺寸情况
    @SerialName("")
    UNKNOWN,
}

/**
 * 将 ImageSizeApiModel 转换为对应的 ImageSize 域模型。
 *
 * 该函数通过调用 ImageSize.valueOf(this.name) 实现转换，
 * 其中 this.name 是枚举常量的名称。需要注意的是，此方法假设 ImageSize 枚举类中存在与 ImageSizeApiModel
 * 中相同的名称（不区分大小写），否则会抛出 IllegalArgumentException。
 *
 * @return 返回一个对应的 ImageSize 枚举实例。
 */
internal fun ImageSizeApiModel.toDomainModel() = ImageSize.valueOf(this.name)

/**
 * 将ImageSizeApiModel对象转换为ImageSizeEntityModel枚举类型对象
 * 此方法通过比较名称（忽略大小写）来查找匹配的枚举项
 * 如果没有找到匹配项，则返回null
 *
 * @return 匹配的ImageSizeEntityModel枚举项，或者null（如果找不到匹配项）
 */
internal fun ImageSizeApiModel.toEntityModel() =
    ImageSizeEntityModel.entries.firstOrNull { it.name.equals(this.name, ignoreCase = true) }